package tools.websocket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * @author lm
 * @date 2022/6/10 14:08
 * @description
 */
@Component
@ServerEndpoint("/realtime")
@Slf4j
public class SocketEndpoint {

    /**
     * @ServerEndpoint 该注解可以将类定义成一个WebSocket服务器端，
     * @OnOpen 表示有浏览器链接过来的时候被调用
     * @OnClose 表示浏览器发出关闭请求的时候被调用
     * @OnMessage 表示浏览器发消息的时候被调用
     * @OnError 表示报错了
     */
    private Session session;

    private static final CopyOnWriteArraySet<SocketEndpoint> SESSIONS = new CopyOnWriteArraySet<>();
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        SESSIONS.add(this);
        log.info("成功建立连接~ 当前总连接数为:%s", SESSIONS.size());
    }

    @OnClose
    public void onClose(Session session) {
        SESSIONS.remove(this);
        log.info("成功关闭连接~ 当前总连接数为:%s", SESSIONS.size());
    }

    @OnMessage
    public void onMessage(Session session, String message) {}

    public void sendMessage(String message) {
        try {
            this.session.getBasicRemote().sendText(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @OnError
    public void onError(Throwable error) {
        log.error("websocket异常", error);
    }
}
